package org.moonlight.jvm.instructions.reserved;

import org.moonlight.jvm.instructions.base.NoOperandsInstruction;
import org.moonlight.jvm.natives.NativeMethod;
import org.moonlight.jvm.natives.java.lang.clazz.DesiredAssertionStatus0;
import org.moonlight.jvm.natives.java.lang.clazz.GetName0;
import org.moonlight.jvm.natives.java.lang.clazz.GetPrimitiveClass;
import org.moonlight.jvm.natives.java.lang.object.GetClass;
import org.moonlight.jvm.natives.java.lang.object.HashCode;
import org.moonlight.jvm.rtda.exclusive.Frame;
import org.moonlight.jvm.rtda.share.heap.classmember.Method;

/**
 * invoke_native( 0xFE ) 指令: Java虚拟机规范预留了两条指令，操作码分别是 0xFE 和 0xFF
 *                            在这里我们使用 0xFE 这条预留指令，来实现在 Java虚拟机栈 来执行 native 方法
 *
 * @author Moonlight
 * @createTime 2023/9/20 15:15
 **/
public class InvokeNative extends NoOperandsInstruction {

    @Override
    public void execute(Frame frame) {
        // 当前正在执行的方法
        Method method = frame.getMethod();
        // 当前类的类名
        String className = method.getClazz().getName();
        // 当前正在执行的方法的方法名 和 方法描述符
        String methodName = method.getName();
        String methodDescriptor = method.getDescriptor();
        // 查找本地方法
        NativeMethod nativeMethod = NativeMethod.findNativeMethod(className, methodName, methodDescriptor);

        if (nativeMethod == null) {
            throw new UnsatisfiedLinkError(className + "." + methodName + methodDescriptor );
        }

        nativeMethod.nativeMethod(frame);
    }

}
